package com.tang.juc.util;



import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * @author tlm
 * @version 1.0
 * @date 2020/3/18 22:21
 *  Semaphore（信号量）是用来控制同时访问特定资源的线程数量，它通过协调各个线程，保证合理的使用公共资源。
 *    线程可以通过acquire()方法来获取信号量的许可，当信号量中没有可用的许可的时候，线程阻塞，直到有可用
 *    的许可为止。线程可以通过release()方法释放它持有的信号量的许可。
 *
 *    tips:可以用Semaphore限流，比如选课系统最多允许同时200人进行选课操作。
 */
public class SemaphoreTest {
    public static void main(String[] args) {
        //模拟抢车位  假设有3个车位 6辆车去抢
        Semaphore semaphore = new Semaphore(3);

        for(int i=1;i<=6;i++){
           new Thread(()->{
               try {
                   //acquire()得到  抢到车位
                   semaphore.acquire();
                   System.out.println(Thread.currentThread().getName()+"抢到了车位");
                   //2秒后离开车位
                   TimeUnit.SECONDS.sleep(2);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }finally {
                   //释放 真正的离开车位
                   System.out.println(Thread.currentThread().getName()+"离开了车位");
                   semaphore.release();
               }
           },String.valueOf(i)).start();
        }
        /*
        输出结果：
        1抢到了车位
        3抢到了车位
        2抢到了车位
        2离开了车位
        3离开了车位
        1离开了车位
        4抢到了车位
        5抢到了车位
        6抢到了车位
        4离开了车位
        5离开了车位
        6离开了车位
         */
    }
}
